home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / a_utils / perl / prlbkxmp.lha / ch6 / KILL < prev    next >
Text File  |  1991-01-08  |  6KB  |  265 lines

  1. #!/usr/bin/perl
  2.  
  3. $BSD = -f '/vmunix';
  4.  
  5. $_ = $0;
  6. if ($_ =~ /KILL$/) {
  7.     if ($#ARGV >= 0) {
  8.     $_ .= ' ' . shift;
  9.     }
  10.     else {
  11.     $_ .= ' appl';
  12.     }
  13. }
  14.  
  15. $ENV{'IFS'} = '' if $ENV{'IFS'};        # plug sh security hole
  16. $applbin = '/appl/bin';
  17. $ENV{'PATH'} = "$applbin:/bin:/usr/bin:/usr/local/bin";
  18.  
  19. if (/xyz/) {
  20.     do killsys('xyz');
  21. }
  22. elsif (/def/) {
  23.     do killsys('def');
  24. }
  25. elsif (/abc/) {
  26.     do killsys('abc');
  27. }
  28. elsif (/appl/) {
  29.     @ARGV = ();
  30.     do killsys('xyz');
  31.     do killsys('def');
  32.     do killsys('abc');
  33.     do killipc();
  34.     do killall();
  35.     sleep 1;                    # give them a chance to die
  36.     if (&count_attached()) {
  37.     sleep 5;                # give them a longer chance
  38.     if (&count_attached()) {
  39.         die <<CURTAINS;
  40. WARNING: I can't find all the processes with shared memory.
  41. CURTAINS
  42.     }
  43.     }
  44. }
  45. else {
  46.     die "Usage: KILL subsystem [pids]";
  47. }
  48. exit 0;
  49.  
  50. sub killsys {
  51.     $sys = shift(@_);
  52.     if ($sys =~ /xyz/) {
  53.     $pat1 = ' xyzzy$| plugh$| plover$';
  54.     $pat2 = 'xyzzy|plugh';
  55.     }
  56.     elsif ($sys =~ /def/) {
  57.     $pat1 = ' def$| [a-zA-Z].def$';
  58.     $pat2 = 'def';
  59.     }
  60.     elsif ($sys =~ /abc/) {
  61.     $pat1 = ' abcdaemon$';
  62.     $pat2 = 'abc';
  63.     }
  64.     else {
  65.     die "Internal error, stopped";
  66.     }
  67.  
  68. # If no pids specified, make up our own list
  69.  
  70.     if ($#ARGV < 0) {
  71.     if ($BSD) {
  72.         open(PS, '/bin/ps axc|') || warn "Can't run ps\n";
  73.     }
  74.     else {
  75.         open(PS, '/bin/ps -ef|') || warn "Can't run ps\n";
  76.     }
  77.  
  78.     while (<PS>) {
  79.         if ($BSD) {
  80.         $pid = $_ + 0;
  81.         }
  82.         else {
  83.         $pid = substr($_,9,6) + 0;
  84.         $COMMAND = index($_,"COMMAND") if $COMMAND < 1;
  85.         $_ = substr($_,$COMMAND);
  86.         @ary = split;
  87.         $_ = shift(@ary);
  88.         s|.*/||;
  89.         $_ = ' ' . $_;
  90.         }
  91.         push(ARGV,$pid) if $_ =~ $pat1;
  92.     }
  93.     warn "No $sys processes found.\n" unless @ARGV;
  94.     close(PS);
  95.     $checking = 0;
  96.     }
  97.     else {
  98.     $checking++;    # we'll need to check propriety
  99.     }
  100.  
  101.     # now get info necessary for logging
  102.  
  103.     chop($date = `date`);
  104.     $date =~ s/ [A-Z][DS]T 19[89][0-9]//;
  105.     chop($whoami = `who am i`);
  106.     $whoami =~ s/[ \t]+/ /g;
  107.     $whoami =~ s/^[a-z]*!//;
  108.  
  109.     while ($pid = shift) {
  110.     open(KILLLOG,">>/local/tmp/${sys}_kill_log");
  111.     if ($checking && `/bin/ps -p$pid` !~ $pat2) {
  112.         print KILLLOG $date, ' ', $whoami,
  113.           " not allowed to kill ",$pid,"\n";
  114.         print "$pid is not a $sys process!\n";
  115.     }
  116.     else {
  117.         print KILLLOG $date, ' ', $whoami,
  118.           ' killed ',$pid,"\n";
  119.         $pid =~ /(.*)/;
  120.         $pid = $1;
  121.         kill 15, $pid;    # Give 'em a shot across the bow.
  122.         sleep(5);         # I hope this is long enough...
  123.         kill 9, $pid;     # Deep six 'em.
  124.     }
  125.     close(KILLLOG);
  126.     }
  127. }
  128.  
  129. sub killipc {
  130.     @goners = ();
  131.     open(IPCS,"ipcs -a |") || warn "Can't run ipcs\n";
  132.     while (<IPCS>) {
  133.     $LSPID = index($_,'LSPID') unless $LSPID > 0;
  134.     $LRPID = index($_,'LRPID') unless $LRPID > 0;
  135.     $CPID = index($_,' CPID') unless $CPID > 0;
  136.     $LPID = index($_,' LPID') unless $LPID > 0;
  137.     $SEGSZ = index($_,'SEGSZ') unless $SEGSZ > 0;
  138.     if (/^q/) {
  139.         if ($LSPID > 0) {
  140.         $pid = substr($_,$LSPID,6) + 0;
  141.         $pid =~ /^(\d+)$/;      # Untaint $pid.
  142.         $pid = $1;
  143.         push(@goners,$pid) if $pid > 1;
  144.         }
  145.         if ($LRPID > 0) {
  146.         $pid = substr($_,$LSPID,6) + 0;
  147.         $pid =~ /^(\d+)$/;      # Untaint $pid.
  148.         $pid = $1;
  149.         push(@goners,$pid) if $pid > 1;
  150.         }
  151.     }
  152.  
  153.     elsif (/^m/) {
  154.         next if substr($_,$SEGSZ,6) == 4096;
  155.         if ($CPID > 0) {
  156.         $pid = substr($_,$CPID,6) + 0;
  157.         $pid =~ /^(\d+)$/;      # Untaint $pid.
  158.         $pid = $1;
  159.         push(@goners,$pid) if $pid > 1;
  160.         }
  161.         if ($LPID > 0) {
  162.         $pid = substr($_,$LPID,6) + 0;
  163.         $pid =~ /^(\d+)$/;      # Untaint $pid.
  164.         $pid = $1;
  165.         push(@goners,$pid) if $pid > 1;
  166.         }
  167.     }
  168.     }
  169.     close(IPCS);
  170.  
  171.     kill 9, @goners;
  172. }
  173.  
  174. sub killall {
  175.     @goners = ();
  176.     if ($BSD) {
  177.     open(PS, '/bin/ps axww|') || warn "Can't run ps\n";
  178.     }
  179.     else {
  180.     open(PS, '/bin/ps -ef|') || warn "Can't run ps\n";
  181.     }
  182.     $head = <PS>;
  183.     $COMMAND = index($head,"COMMAND") if $COMMAND <= 0;
  184.     while (<PS>) {
  185.     if ($BSD) {
  186.         $pid = $_ + 0;
  187.     }
  188.     else {
  189.         $pid = substr($_,9,6) + 0;
  190.     }
  191.     $cmd = substr($_,$COMMAND);
  192.     @ary = split(' ',$cmd);
  193.     $_ = shift(@ary);
  194.     s|.*/||;
  195.     if (/^(perl|csh|sh|\[.*\])$/) { # Ignore 1st argument?
  196.         $_ = shift(@ary);
  197.         s|.*/||;
  198.     }
  199.  
  200.     $prog = $_;
  201.     if (! -f "$applbin/$prog" && $cmd =~ /\((\w+)\)/) {
  202.         $prog = $1;
  203.     }
  204.     if ($prog eq 'START'
  205.       || $prog eq '.START'
  206.       || $prog eq 'wall'
  207.       || ($prog =~ /KILL$/ && $pid != $$)) {
  208.         push(@finally,"$pid $prog");
  209.         next;
  210.     }
  211.     next if $prog =~ /KILL$/;
  212.     if (-f "$applbin/$prog") {
  213.         $pid =~ /(.*)/;
  214.         $pid = $1;
  215.         push(goners,$pid);
  216.         print "Killing $prog, pid $pid\n";
  217.     }
  218.     }
  219.     close(PS);
  220.  
  221.     kill 15,@goners;
  222.     sleep(5);
  223.     kill 9,@goners;
  224.  
  225.     if ($#finally >= 0) {
  226.     sleep(6);
  227.     for (@finally) {
  228.         ($pid,$prog) = split;
  229.         $pid =~ /(\d+)/;
  230.         $pid = $1;
  231.         print "Killing $prog, pid $pid\n" if kill 9,$pid;
  232.     }
  233.     }
  234. }
  235.  
  236. sub count_attached {
  237.     $attached = 0;
  238.     open(IPCS,"ipcs -a |") || warn "Can't run ipcs\n";
  239.     $ipcrm = '';
  240.     while (<IPCS>) {
  241.     $SEGSZ = index($_,'SEGSZ') unless $SEGSZ > 0;
  242.     $NATTCH = index($_,'NATTCH') unless $NATTCH > 0;
  243.     $killnum = $1 if /^[msq]\s*(\d+)/;
  244.     if (/^m/) {
  245.         next if substr($_,$SEGSZ,6) == 4096;
  246.         $ipcrm .= " -m $killnum";
  247.         $attached += substr($_,$NATTCH,6) if $NATTCH > 0;
  248.     }
  249.     elsif (/^s/) {
  250.         $ipcrm .= " -s $killnum";
  251.     }
  252.     elsif (/^q/) {
  253.         $ipcrm .= " -q $killnum";
  254.     }
  255.     }
  256.     close(IPCS);
  257.     if ($ipcrm) {
  258.     $ipcrm =~ /(.*)/;
  259.     $ipcrm = $1;
  260.     print "ipcrm$ipcrm\n";
  261.     system "ipcrm$ipcrm";
  262.     }
  263.     $attached;
  264. }
  265.